#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#include "thread_parsexml.h"
#include "thread_comm.h"

#define PARSEXML_DBG     1
#define PARSEXML_ERR     1
#define PARSEXML_MODULE_TAG  " [PARSEXML]"

#if PARSEXML_DBG
#define PARSEXML_DBG_MSG(format, arg...) \
    do  \
    {   \
        printf("%s""<%d>===> "format, PARSEXML_MODULE_TAG,__LINE__,##arg);  \
    }   \
    while (0);
#else
#define PARSEXML_DBG_MSG(format, arg...)
#endif


#if PARSEXML_ERR
#define PARSEXML_ERR_MSG(format, arg...) \
    do  \
    {   \
        printf("%s""<%d>===> "format, PARSEXML_MODULE_TAG,__LINE__,##arg);  \
    }   \
    while (0);
#else
#define PARSEXML_ERR_MSG(format, arg...)
#endif

static int msgquequeid;

static EN_ERROR_CODE parsexml_proc_msg(ST_MSG msg)
{
    int ret;
	EN_ERROR_CODE err = EN_ERROR_CODE_FAIL;
	
	if ( MSG_T_PARSEXML != msg.type ) 
	{
		return EN_ERROR_CODE_MSG_TYPE_FAIL;
	}

	//start parsexml module parse xml file
    PARSEXML_DBG_MSG(" parse xml file\n");
	err = read_cfg(TMP_CFG_PATH, 0);
    if ( err == EN_ERROR_CODE_SUCCESS )
    {
        printf("doooo\n");
        write_cfg(CFG_PATH );
        
        ret = remove(TMP_CFG_PATH);
        if ( ret < 0 )
        {
            perror("remove");
        }
#if 0
        msg.type = MSG_T_433M;
        msg.p1 = MSG_ST_CFG;
		err = msgsnd(msgquequeid, (void *)&msg, MSG_CONT_LEN, IPC_NOWAIT);
		if ( err < 0 )
		{
			PARSEXML_ERR_MSG(" send err\n");
			return EN_ERROR_CODE_FAIL;
		}
        PARSEXML_DBG_MSG("SEND MSG :%d\n", msg.type);
#endif

        msg.type = MSG_T_CAMERA;
        msg.p1 = MSG_ST_CFG;
		err = msgsnd(msgquequeid, (void *)&msg, MSG_CONT_LEN, IPC_NOWAIT);
		if ( err < 0 )
		{
			PARSEXML_ERR_MSG("send err \n");
			return EN_ERROR_CODE_FAIL;
		}
        PARSEXML_DBG_MSG("SEND MSG :%d\n", msg.type);

        msg.type = MSG_T_GSM;
        msg.p1 = MSG_ST_CFG;
		err = msgsnd(msgquequeid, (void *)&msg, MSG_CONT_LEN, IPC_NOWAIT);
		if ( err < 0 )
		{
			PARSEXML_ERR_MSG("send err \n");
			return EN_ERROR_CODE_FAIL;
		}
        PARSEXML_DBG_MSG("SEND MSG :%d\n", msg.type);

/*
        msg.type = MSG_T_GSM;
        msg.p1 = MSG_ST_CFG;
		err = msgsnd(msgquequeid, (void *)&msg, MSG_CONT_LEN, IPC_NOWAIT);
		if ( err < 0 )
		{
			PARSEXML_ERR_MSG("send err \n");
			return EN_ERROR_CODE_FAIL;
		}
        PARSEXML_DBG_MSG("SEND MSG :%d\n", msg.type);
*/
        msg.type = MSG_T_UPGRADE;
        msg.p1 = MSG_ST_CFG;
		err = msgsnd(msgquequeid, (void *)&msg, MSG_CONT_LEN, IPC_NOWAIT);
		if ( err < 0 )
		{
			PARSEXML_ERR_MSG("send err \n");
			return EN_ERROR_CODE_FAIL;
		}
        PARSEXML_DBG_MSG("SEND MSG :%d\n", msg.type);
    }
    
	return err;
}


void *thread_parsexml(void *arg)
{
    int ret;
    ST_MSG msg;

    msgquequeid = *((int*)arg);
    
    while (1)
    {
        PARSEXML_DBG_MSG("thread_parsexml running\n");
        ret = msgrcv(msgquequeid, (void*)&msg, MSG_CONT_LEN, MSG_T_PARSEXML, 0);
        if ( ret < 0 )
        {
            perror("msgrcv");
        }
        PARSEXML_DBG_MSG("RECV MSG %d\n", msg.type);

		parsexml_proc_msg(msg);
    }
		
    return ( ( void * )EN_ERROR_CODE_SUCCESS ); 

}

